//package com.hzy.elastic.query;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.google.common.collect.Lists;
//import com.hzy.elastic.entity.QueryEnum;
//import org.apache.commons.lang3.StringUtils;
//import org.elasticsearch.index.query.*;
//
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//
//public class QueryUtils {
//
//    /**
//     * 将query解析成Java代码
//     * query 按照es的查询格式解析
//     * t对象中兼容各种查询
//     * @param query
//     * @param t
//     * @param <T>
//     * @return
//     */
//    public <T> QueryBuilder buildQuery(String query, T t){
//
//        return null;
//    }
//
//    public <T> void judgeByType(String key, String query, AbstractQueryBuilder queryBuilders){
//        switch (key){
//            case "range":
//                List<RangeQueryBuilder> result =  range(query);
//                for (RangeQueryBuilder q: result){
//                    queryBuilders.
//                }
//                QueryBuilders.
//                break;
//            case "lt":
//                break;
//            case "gt":
//                break;
//            case "lte":
//                break;
//            case "term":
//                break;
//            case "terms":
//                break;
//            case "match":
//                break;
//            case "must_not":
//                break;
//            case "multi_match":
//                break;
//            default:
//                break;
//        }
//    }
//
//    public Object bool(String query){
//        if (isBlank(query)){
//            return Lists.newArrayList();
//        }
//        Object obj = JSON.parse(query);
//        if (!(obj instanceof JSONObject)){
//            return Lists.newArrayList();
//        }
//        JSONObject jsonObject = (JSONObject) obj;
//        Map<String, Object> innerMap = jsonObject.getInnerMap();
//        Iterator<String> it = innerMap.keySet().iterator();
//
//        BoolQueryBuilder queryBuilders = QueryBuilders.boolQuery();
//        while (it.hasNext()){
//            String key = it.next();
//            String value = innerMap.get(key).toString();
//            judgeByType(key, value, queryBuilders);
//        }
//    }
//
//    /**
//     * range
//     * @param query
//     */
//    public List<RangeQueryBuilder> range(String query){
//        if (isBlank(query)){
//            return Lists.newArrayList();
//        }
//        List<RangeQueryBuilder> result = Lists.newArrayList();
//        // 解析 "range":{"age":	{"gte":20,"lt":30}}
//        Object obj = JSON.parse(query);
//        if (obj instanceof JSONObject){
//            JSONObject jsonObject = (JSONObject) obj;
//            Map<String, Object> innerMap = jsonObject.getInnerMap();
//            Iterator<String> it = innerMap.keySet().iterator();
//            while (it.hasNext()){
//                String key = it.next();
//                RangeQueryBuilder rqb = QueryBuilders.rangeQuery(key);
//                String value = innerMap.get(key).toString();
//                if (StringUtils.isBlank(value)){
//                    continue;
//                }
//                Object child = JSON.parse(value);
//                if (child instanceof JSONObject){
//                    JSONObject childJson = (JSONObject) child;
//
//                    Map<String, Object> childMap = childJson.getInnerMap();
//                    Iterator<String> childIt = childMap.keySet().iterator();
//                    while (childIt.hasNext()){
//                        String childKey = it.next();
//                        String childValue = childMap.get(childKey).toString();
//                        if (QueryEnum.gte.getName().equals(childKey)){
//                            rqb.gte(childValue);
//                        } else if (QueryEnum.gt.getName().equals(childKey)){
//                            rqb.gt(childValue);
//                        } else if (QueryEnum.lt.getName().equals(childKey)){
//                            rqb.lt(childValue);
//                        } else if (QueryEnum.lte.getName().equals(childKey)){
//                            rqb.lte(childValue);
//                        }
//                    }
//                }
//                result.add(rqb);
//            }
//        }
//        return result;
//    }
//
//    /**
//     * 判空
//     * @param query
//     * @return
//     */
//    public boolean isBlank(String query){
//        if (StringUtils.isBlank(query)){
//            return true;
//        }
//        Object obj = JSON.parse(query);
//        if (obj instanceof JSONObject && ((JSONObject) obj).size() == 0){
//            return true;
//        }
//        if (obj instanceof JSONArray && ((JSONArray) obj).size() == 0){
//            return true;
//        }
//        return false;
//    }
//}
